Синтаксис:
int ldbfAppend(ldbfDB *data)
Добавляет новую запись в таблицу. Если таблица имеет индексы,
то они будут изменены. Возвращает -1 в случае ошибки, иначе 0. В случае
добавления записи под транзакцией, текущий номер новой записи будет известен
только после завершении транзакции, т.е. в процессе транзакции
поле recno в data будет иметь значение 0.
Пример:
int sock;
ldbfDB *data;
ldbfFIELD *field;
Синтаксис:
void ldbfBlank(ldbfDB *data)
Чистит буфер текущей записи.Все поля текущей записи становятся
пустыми ( в xBase они заполняются пробелами ).
См. также:ldbfAppend()
Синтаксис:
int ldbfBottom(ldbfDB *data)
Устанавливает указатель текущей записи в конец таблицы.
В буфер записи читается содержимое последней записи. Если был установлен
текущей индекс, указатель будет установлен на последнюю запись согласно
индексному выражению. Возвращает 0 в случае успеха, -1 в случае ошибки.
Пример:
/* Проход по таблице с конца */
ldbfSetTag(data,"no");
ldbfBottom(data);
while(!ldbf_errno) ldbfSkip(data,-1);
См. также:ldbfSkip()
Синтаксис:
ldbfDB *ldbfCreate(int sock,char *name,ldbfFIELDINFO *field_info,ldbfTAGINFO *tag_info)
Создает новую таблицу и возвращает указатель на структуру
типа ldbfDB, в которой хранится информация по открытой таблице. Все
функции работы с таблицами используют указатель на тип ldbfDB для ссылки на
таблицу. 'field_info' содержит описание структуры таблицы, а 'tag_info' - структуру
индексов данной таблицы. 'name' - имя создаваемой таблицы, оно является существующим
в ldbf.conf алиасом. Если таблица по каким-то причинам не создана, возвращает
0 и устанавливает код ошибки в ldbf_errno.
Пользователь должен иметь права на создание таблиц, см. описание параметра
create_allow в ldbf.conf.
Структура 'ldbfFIELD_INFO':
Структура 'ldbfTAGINFO':
Пример:
Синтаксис:
int ldbfDelete(ldbfDB *data)
Помечает текущую записькак удаленую. В первом байте текущей записи
ставится знак '*', это означает, что данная запись удалена. Вы можете контролировать
просмотр удаленных записей с помощью функции ldbfSetOnOff() c параметром SET_DELETED.
Пример:
int sock,ok;
ldbfDB *file;
sock = ldbfConnect(servname);
file = ldnfOpen( sock, "DATA" ) ;
ok = ldbfTop(file);
while (ok > 0) {
ok = ldbfDelete( file );
ok = ldbfSkip(file,2);
}
ldbfCloseall( sock );
ldbfShutdown(sock);
См. также:ldbfRecall()
Синтаксис:
int ldbfDeleted(ldbfDB *data)
Возвращает 1 если текущая запись является помеченной на удаление.
Пример:
Синтаксис:
int ldbfGo(ldbfDB *data,long record_number)
Устанавливает указатель текущей записина запись с номером 'record_number'
и читает ее содержимоев локальный буфер. Возвращает 0 в случае успеха, -1 в случае ошибки.
Пример:
ldbfGo(data,20);
while(ldbfRecno(data) < 100 && !ldbf_errno)
{
printf("%s\n",ldbfStr(ldbfField(data,"name")));
ldbfSkip(data,1);
}
Синтаксис:
int ldbfLock(ldbfDB *data,long record_num)
Блокирует запись с номером'record_num'. Если запись или вся таблица
уже заблокирована другим пользователем, возвращается -1, иначе 0. После успешной блокировки
никто не может изменить данную запись,она доступна только по чтению.
Пример:
ldbfDB *data;
data = ldbfOpen( sock, "DATA" );
if(!ldbfLock( data, 5 ))
printf( " Record 5 is now locked.\n" );
else
printf(" Record 5 is locked by another\n");
Синтаксис:
int ldbfFlock(ldbfDB *data)
Блокирует всю таблицу.Таблица становится доступна для других пользователей
только по чтению. Если таблица не может быть заблокирована, возвращается -1.
Пример:
if(ldbfFlock(data) !=- 1) { /* заблокирована
*/
ldbfGo(data,5);
ldbfAssign(ldbfField(data,"name"),"John");
ldbfUpdate(data);
}
ldbfFunlock(data);
См. также:ldbfLock()
Синтаксис:
ldbfDB *ldbfOpen(int sock,char *name,int mode)
Oткрывает таблицу ивозвращает указатель на структуру ldbfDB. 'name' содержит
алиас таблицы. 'mode' может
принимать следующиезначения:
Структура ldbfDB содержит следующие поля:
См. также:ldbfClose(), ldbfCloseall()
Синтаксис:
int ldbfPosition(ldbfDB *data)
Возвращает позицию текущей записи в таблице,выраженную в процентах.
В случае ошибки возвращает-1. Может быть полезна при использовании скроллинга
при построении интерактивных программ.
См. также:ldbfPosition_set()
Синтаксис:
int ldbfPosition_set(ldbfDB *data,int per)
Устанавливает указатель текущей записи на позицию,
соответсвующую числу 'per', выраженному в процентах. Например, если
в таблице 100 записей и была выдана ldbfPosition_set( data,50), указатель
установится на 50 запись, так как 50 процентов соответсвует записи с номером
50.
Синтаксис:
int ldbfRecall(ldbfDB *data,long rec)
Снимает пометку наудаление записи 'rec'. Если данная запись не помечена
как удаленная, ничего не просходит.
Синтаксис:
long ldbfRecno(ldbfDB *data)
Возвращает номер текущей записи в таблице. В случае ошибки
возвращает -1.
Синтаксис:
long ldbfReccount(ldbfDB *data)
Возвращает количество записей в таблице. В случае ошибки возвращает
-1. Вы можете также получить информацию о количестве записей в таблице, взяв
значение поля reccount в структуре 'data', но оно может
не соответсвовать фактическому количеству записей в таблице. ldbfReccount()
всегда возвращает реальное количество записей.
Пример:
printf("Старое кол-во:%ld Реальное кол-во %ld\n",
data->reccount.ldbfReccount(data));
Синтаксис:
void ldbfSetTag(ldbfDB *data,char *tagname)
Устанавливает текущий индекс. Он будет использоваться функцией ldbfSeek()
в дальнейшем.
Синтаксис:
int ldbfSeek(ldbfDB *data,char *ptr)
Производит поиск в таблице, используя текущий индекс.
Если поиск был успешный, найденая запись становится текущей. Если индекс типа
Date, 'ptr' должна содержать значение в
формате "CCYYMMDD". Если индекс строкового типа, 'ptr' может
содержать любую строку, заканчивающуюся нулем. Если индекс числовой, 'ptr' должна содержать
только числовые символы. Если запись найдена, возвращает 1.
Пример:
ldbfDB *people;
ldbfFIELD *age_field;
long julian_day;
int rc;
/* Предположим таблица имеет индексы: NAME_TAG, AGE_TAG, и BIRTH_TAG.*/
people = ldbfOpen( sock, "people", 0 );
/* NAME_TAG - строковый индекс */
ldbfSetTag(people,"NAME_TAG") ;
if(ldbfSeek( people, "FRED " ) == 0 )
printf( " FRED в записи:%d\n", people->recno );
/* AGE_TAG числовой индекс */
strcpy( people->tag, "AGE_TAG" ) ;
age_field = ldbfField( people, "AGE_ldbfFIELD") ;
rc = ldbfSeek( people, "0" ) ;
if(rc == 0)
printf( " Самый молодой: %d", ldbfDouble(age_field));
/* BIRTH_TAG индекс типа дата */
strcpy( people->tag, "BIRTH_TAG" ) ;
ldbfSeek( people, "19600415" ) ;
Синтаксис:
int ldbfLocateFirst(ldbfDB *data,char *begin,char *end,char *condition)
Функция предназначена для выборки нужных записей в одной таблице.
Если установлен текущий индекс, то он будет использоваться. 'begin' предназначен
для установки начала поиска, в противном случае сканирование производится
от начала таблицы. Поиск ведется до тех пор, пока выражение 'end' входит в
результат индексного выражения. 'condition' является xBase выражением,
в котором можно использовать функции и операторы, допустимые в индексных
выражениях. Как только условие 'condition' станет истинным, функция возвращает
найденую запись. В случае достижения конца таблицы или если выражение 'end' ложно, возвращается
-1.
Следует заметить, что поиск выполняется полностью на сервере,
клиенту будет переслана только найденная запись.
Пример:
/* Таблица 'codes' имеет следующие поля:
code - код города,
city - название города.
Существует индекс по полю 'code'. */
ldbfSetTag(data,"code");
/* ищем первую запись в диапазоне кодов '044' на предмет
кода, начинающегося на '0443' */
ldbfLocateFirst(data,"044","substr(kod,1,3)='044'",
"substr(code,1,4)='0443'");
Синтаксис:
int ldbfLocate(ldbfDB *data,char *end_cond,char *condition)
Аналогична функции ldbfLocateFirst(), но выполняет
поиск, начиная со следующей от текущей записи. Если используется
индекс, то поиск осуществляется до тех пор, пока выражение 'end_cond' истинно.
В противном случае, используется последовательный поиск в таблице 'ldbfDB'.
Пример:
/* ищем первую запись в диапазоне кодов '044' на предмет кода, начинающегося
на '0443' */
ldbfSetTag(data,"code");
ldbfLocateFirst(data,"044","substr(code,1,3)='044'",
"substr(code,1,4)='0443'");
while(!ldbf_errno) {
printf("%s\n",ldbfStr(ldbfField(data,"code")));
ldbfSkip(data,1);
ldbfLocate(data,"substr(code,1,3)='044'",
"substr(code,1,4)='0443'");
}
Синтаксис:
int ldbfSkip(ldbfDB *data,long num_records)
Функция пропускает 'num_records' записей относительно
текущей записи. Если установлен текущий индекс, пропуск идет в последовательности
данного индекса. Если 'num_records' больше нуля, пропускаются записи по направлению
к концу таблицы, если меньше нуля - к началу. Указатель текущей записи
меняется и установленная запись читается в буфер.
ldbf_errno может содержать
в случае ошибки:
Пример:
/* Найдем последнюю запись в таблице, чье поле NAME field содержит "John". */
ldbfDB *name_list;
ldbfFIELD *name;
int ok;
name_list = ldbfOpen( sock, "NAMES" ,0);
name = ldbfField( name_list, "NAME" ) ;
ok = ldbfBottom(name_list);
while (!ok) {
if(strncmp(ldbfPtr(name), "John", 4) == 0) {
printf( " John в записи:%ld\n",name_list->recno ) ;
ldbfShutdown(sock);
exit(0);
}
ldbfSkip(name_list,-1);
}
printf( " John не найден\n" ) ;
Синтаксис:
int ldbfTop(ldbfDB *data)
Указатель текущей записи устанавливается в начало таблицы.
Если был установлен текущей индекс, указатель будет установлен
на первую запись согласно индексному выражению. Возвращает -1 в случае ошибки.
Пример:
ldbfDB *data;
...
ldbfTop(data);
while(!ldbf_errnno) {
...
ldbfSkip(data,1);
}
См. также:ldbfBottom(), ldbfSkip(),
ldbfSeek()
Синтаксис:
void ldbfFunlock(ldbfDB *data)
Удаляет все блокировки из таблицы и разблокирует
таблицу если таковая была заблокирована с помощью функции ldbfFlock().
См. также:ldbfUnlock()
Синтаксис:
void ldbfUnlock(ldbfDB *data,long rec)
Разблокирует запись 'rec' в таблице 'data'.
Пример:
ldbfDB *data;
...
ldbfGo(data,200);
/* выполняем какие либо действия, особбено если необходимо
произвести изменения в форме ввода */
if(ldbfLock(data)) {
ldbfUpdate(data);
ldbfUnlock(data,ldbfRecno(data));
}
См. также:ldbfFunlock()
Синтаксис:
void ldbfZap(ldbfDB *data)
Удаляет физически все записи из таблицы. Таблица должна
быть открыта в эксклюзивном режиме ( параметр O_EX в функцииldbfOpen()).
Синтаксис:
int ldbfDrop(int sock,char *db)
Удаляет таблицу. Пользователь должен иметь права на эту
операцию (см. drop_allow в ldbf.conf). Возвращает -1, если таблица не может быть
удалена.
Синтаксис:
char *ldbfAliasList(int sock)
Возвращает указательна строку, содержашую список таблиц,
доступных для открытия. Таблицы в списке
разделены запятой. Если таблица доступна в режиме только для чтения,
перед ее именем стоит знак подчеркивания '_'.
Пример:
int sock;
char *str,str1[20];
ldbfDB *db;
if((sock = ldbfConnect("localhost"))) {
str = ldbfAliasList(sock);
printf("Выберите таблицу:%s:",str);
gets(str1);
db = ldbfOpen(sock,str1);
}
Синтаксис:
ldbfTAGINFO *ldbfTaginfo(ldbfDB* data)
Возвращает структуру индексов таблицы. Данная структурахранится в
структуре ldbfDB открытой таблицы.
Пример:
ldbfDB *data;
int i;
ldbfTAGINFO *taginfo;
. . .
taginfo = data->tags;
for(i = 0; taginfo[i].name[0] != '\0'; i++)
printf("%s|%s|%s|%d%d\n",taginfo[i].name,taginfo[i].expression,
taginfo[i].filter,taginfo[i].unique,tagonfo[i].descending);
Синтаксис:
void ldbfClose(ldbfDB* data)
Закрывает таблицу.
Синтаксис:
int ldbfUpdate(ldbfDB* data)
Обновляет текущую запись в таблице. При изменении значения поля
записи и для сохранения результата необходимо вызывать данную функцию.
Пример:
ldbfDB *db;
. . .
ldbfBlank(db);
ldbfReplace("base","name","John");
ldbfReplace("base","post","manager");
ldbfUpdate(db);
. . .
См. также:ldbfAppend()
Синтаксис:
void ldbfFlush(ldbfDB* data)
Указывает серверу записать таблицу на диск. Все изменения,находящиеся
в буфере сервера будут сброшены в файл.
Синтаксис:
ldbfDB *ldbfInsert (long sock,char *data,char *field_list,
char *values_list)
Добавляет запись в таблицу. Это аналог функции ldbfAppend()
за исключением того, что изменения полей и добавление выполнены в одном операторе.
Таблица необязательно должна быть открыта. При успешном выполнении функция вернет
указатель на открытую таблицу. 'data' содержит алиас таблицы, 'field_list'
- список полей через запятую, 'values_list' - список значений
через запятую.
См. также:ldbfModify(),
ldbfCreate(),
ldbfAppend()
Пример:
Синтаксис:
ldbfDB *ldbfModify(long sock,char *data,char *field_list,char *values_list)
Изменяет текущую запись. Соответсвует ldbfUpdate(), но делает
это в одной функции. Возвращает указатель на открытую таблицу.
Пример:
ldbfDB *data = ldbfOpen(sock,"data");
ldbfGo(data,10);
ldbfModify(sock,"data","name,address,zip","John,
New York,12345");
ldbfGo(data,11);
ldbfModify(sock,"data","name,address,zip","Joe,
Los Angeles,4758");
См. также:ldbfInsert(),
ldbfUpdate()
Синтаксис:
ldbfDB *ldbfCreateDBF(long sock,char *data,char *field_list,char *tag_list)
Создает новую таблицу.Аналогична функции ldbfCreate(),
но более компактна.
Формат списка полей:
field_list = field_name(type[:len[:dec]]); field_name(type[:len[:dec]])
где:
Формат списка индексов:
tag_list = tag_name(expression[:filter[:unique[:descending]]]);
где:
Пример:
data=ldbfCreateDBF(sock,"data","name(C:25);address(C:50);zip(N:10:1)",
"name(name); address(address::1); zip(zip,zip>0:1:1)");
См. также:ldbfCreate()
Функции обработки записей
sock = ldbfConnect(servname);
data = ldbfOpen( sock, "TESTER" );
ldbfGo(data,2); /* Перемещаемся на вторую запись */
ldbfAppend(data); /* Добавляем копию текущей записи в конец таблицы*/
ldbfBlank(data); /* Делаем все поля текущей записи пустыми*/
field = ldbfField( data, "ldbfFIELD_NAME" );
/* назначаем значение полю 'ldbfFIELD_NAME' */
ldbfAssign( field, "New Field Value" );
ldbfAppend(data); /* добаляем запись */
ldbfClose(data);
ldbfShutdown(sock);
typedef struct {
char name[11]; /* имя поля */
char type; /* тип поля - C, N, D, L, M */
int len; /* длина поля */
int dec; /* кол-во знаков после запятой */
} ldbfFIELDINFO;
typedef struct {
char name[11]; /* имя индекса */
char expression[51]; /* выражение */
char filter[51]; /* фильтр */
char unique; /* 1, если индекс уникальный */
char descending; /* 1, если индекс убывающий */
} ldbfTAGINFO;
int sock;
ldbfDB *data;
ldbfFIELDINFO dd[3]; /* 3 структуры для 2 полей, последняя должна быть заполнена нулем */
ldbfTAGINFO t[2];
memset(&dd,0,sizeof(dd));
memset(&t,0,sizeof(t));
strcpy(dd[1].name,"Name");
dd[1].type = 'C'; /* символьное поле */
dd[1].len = 10;
strcpy(dd[2].name,"Wage");
dd[2].type = "N"; /* числовое поле */
dd[2].len = 7;
dd[2].dec = 2;
strcpy(t[1].name,"TagThing");
strcpy(t[1].expression,"Name");
t[1].filter = 0;
t[1].unique = 0;
t[1].descending = 0;
sock = ldbfConnect(servname);
data = ldbfCreate( sock,"NEW_DATA", &field_info, &tag_info ) ;
ldbfDB *db;
int sock;
if((sock = ldbfConnect("localhost"))) {
db = ldbfOpen(sock,"base");
/* показывем все неудаленные записи */
ldbfTop(db);
while(!ldbf_errno) {
if(!ldbfDeleted(db))
printf("%s%s\n", ldbfValue("base","name"),
ldbfValue("base","post"));
ldbfSkip(db,1);
}
}
typedef struct ldbfDB_s {
link_list link;
char alias[32]; /* алиас таблицы */
int sock; /* номер соединения, возвращенный ldbfConnect() */
int handle; /* номер таблицы */
char *record; /* содержимое текушей записи */
int changed; /* 1, если запись изменена */
long recno; /* номер текущей записи */
long reccount; /* общее кол-во записей в таблице */
long record_width; /* длина записи */
int set_deleted; /* 1, если пропускать удаленые записи */
char tag[11]; /* имя текущего индекса */
int n_fields; /* кол-во полей в записи */
ldbfFIELD *fields; /* структура таблицы */
int n_tags; /* кол-во индексов */
ldbfTAGINFO *tags; /* структура индексов */
} ldbfDB;
ldbfDB *data;
ldbfFIELD *name;
data = ldbfInsert(sock,"data","name,address,zip","John, New York, 12345");
if(data) { /* добавление успешно, проверим это */
name=ldbfField(data,"NAME");
printf("%s\n",ldbfStr(name));
}